package cn.com.blueInfo.bpm.system.service.impl;

import cn.com.blueInfo.bpm.system.convert.UserRoleConvert;
import cn.com.blueInfo.bpm.system.entity.UserRole;
import cn.com.blueInfo.bpm.system.repository.UserRoleRepository;
import cn.com.blueInfo.bpm.system.request.UserRoleDTO;
import cn.com.blueInfo.bpm.system.response.UserRoleVO;
import cn.com.blueInfo.bpm.system.service.UserRoleService;
import cn.com.blueInfo.core.util.SnowflakeIdGenerator;
import cn.com.blueInfo.utils.result.ResultInfo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 用户-角色关联表 业务服务实现类
 * @author suxch
 * @since 2025-09-01 19:17:41
 */
@Log4j2
@Service
public class UserRoleServiceImpl implements UserRoleService {

    @Autowired
    private UserRoleRepository userRoleRepository;

    @Autowired
    private SnowflakeIdGenerator snowflakeIdGenerator;

    @Autowired
    private UserRoleConvert userRoleConvert;

    /**
     * 新增用户-角色关联
     * @param userRoleDTO 用户-角色关联参数
     */
    @Override
    public ResultInfo<Integer> addUserRole(UserRoleDTO userRoleDTO) {
        UserRole userRole = userRoleConvert.dtoToEntity(userRoleDTO);
        userRole.setId(snowflakeIdGenerator.nextId());
        Integer addSize = userRoleRepository.createUserRole(userRole);
        return ResultInfo.<Integer>builder().data(addSize).message("用户-角色关联成功新增 {} 条").build();
    }

    /**
     * 批量新增用户-角色关联
     * @param userRoleDTOList 用户-角色关联参数列表
     */
    @Override
    public ResultInfo<Integer> batchAddUserRole(List<UserRoleDTO> userRoleDTOList) {
        List<UserRole> userRoleList = userRoleConvert.dtoToEntity(userRoleDTOList);
        for (UserRole userRole : userRoleList) userRole.setId(snowflakeIdGenerator.nextId());
        Integer addSize = userRoleRepository.batchCreateUserRole(userRoleList);
        return ResultInfo.<Integer>builder().data(addSize).message("用户-角色关联成功新增 {} 条").build();
    }

    /**
     * 删除用户-角色关联
     * @param userRoleId 用户-角色关联ID
     */
    @Override
    public ResultInfo<Integer> removeUserRole(Long userRoleId) {
        Integer removeSize = userRoleRepository.deleteUserRole(userRoleId);
        return ResultInfo.<Integer>builder().data(removeSize).message("用户-角色关联成功删除 {} 条").build();
    }

    /**
     * 批量删除用户-角色关联
     * @param userRoleIdList 用户-角色关联ID列表
     */
    @Override
    public ResultInfo<Integer> batchRemoveUserRole(List<Long> userRoleIdList) {
        Integer removeSize = userRoleRepository.batchDeleteUserRole(userRoleIdList);
        return ResultInfo.<Integer>builder().data(removeSize).message("用户-角色关联成功删除 {} 条").build();
    }

    /**
     * 更新部分用户-角色关联
     * @param userRoleUpdatePartialDTO 用户-角色关联参数
     */
    @Override
    public ResultInfo<Integer> modifyUserRolePartial(UserRoleDTO.UpdatePartialDTO userRoleUpdatePartialDTO) {
        UserRole userRole = userRoleConvert.dtoToEntity(userRoleUpdatePartialDTO);
        Integer modifySize = userRoleRepository.updateUserRolePartial(userRole);
        return ResultInfo.<Integer>builder().data(modifySize).message("用户-角色关联成功更新 {} 条").build();
    }

    /**
     * 更新全部用户-角色关联
     * @param userRoleDTO 用户-角色关联参数
     */
    @Override
    public ResultInfo<Integer> modifyUserRole(UserRoleDTO userRoleDTO) {
        UserRole userRole = userRoleConvert.dtoToEntity(userRoleDTO);
        Integer modifySize = userRoleRepository.updateUserRole(userRole);
        return ResultInfo.<Integer>builder().data(modifySize).message("用户-角色关联成功更新 {} 条").build();
    }

    /**
     * 查询一条用户-角色关联
     * @param userRoleId 用户-角色关联ID
     */
    @Override
    public ResultInfo<UserRoleVO> queryUserRoleById(Long userRoleId) {
        UserRole userRole = userRoleRepository.getUserRoleById(userRoleId);
        UserRoleVO userRoleVO = userRoleConvert.entityToVO(userRole);
        return ResultInfo.<UserRoleVO>builder().data(userRoleVO).message("用户-角色关联查询成功").build();
    }

    /**
     * 分页查询用户-角色关联
     * @param userRoleQueryDTO 用户-角色关联参数
     */
    @Override
    public ResultInfo<Page<UserRoleVO>> queryUserRolePage(UserRoleDTO.QueryDTO userRoleQueryDTO) {
        Page<UserRole> userRolePage = userRoleRepository.getUserRolePage(userRoleQueryDTO);
        Page<UserRoleVO> resultData = userRoleConvert.convertPage(userRolePage);
        return ResultInfo.<Page<UserRoleVO>>builder()
                .data(resultData)
                .message("用户-角色关联分页查询成功，共 {} 条", resultData.getRecords().size())
                .build();
    }

    /**
     * 根据条件查询 用户-角色关联 数量
     * @param userRoleQueryDTO 用户-角色关联参数
     */
    @Override
    public ResultInfo<Long> queryUserRoleCount(UserRoleDTO.QueryDTO userRoleQueryDTO) {
        Long resultCount = userRoleRepository.getUserRoleCount(userRoleQueryDTO);
        return ResultInfo.<Long>builder()
                .data(resultCount)
                .message("用户-角色关联数量查询成功，共 {} 条", resultCount)
                .build();
    }

    /**
     * 根据条件查询 用户-角色关联
     * @param userRoleQueryDTO 用户-角色关联参数
     */
    @Override
    public ResultInfo<List<UserRoleVO>> queryUserRoleList(UserRoleDTO.QueryDTO userRoleQueryDTO) {
        List<UserRole> userRoleList = userRoleRepository.getUserRoleList(userRoleQueryDTO);
        List<UserRoleVO> resultData = userRoleConvert.entityListToVoList(userRoleList);
        return ResultInfo.<List<UserRoleVO>>builder()
                .data(resultData)
                .message("用户-角色关联分页查询成功，共 {} 条", resultData.size())
                .build();
    }
}
